/**
 * app模块是FG系统的总包装, 其中包含了mapPanel, projectPanel, dispatcher等等组件,
 * 并负责系统的初始化.
 */

var FG;
if (!FG)
    FG = {};

// // 初始的一些设置
// alertify.set({ labels: {
//     ok     : "确定",
//     cancel : "取消"
// } });
//
// // TODO: 转为从后端加载配置
// DX.set({
//     mapCoordinateType: 'degree'   // 'degree', 'dms'
// });

FG.App = function(options) {
    // var options_ = options || {};
    //
    // var this_ = this;
    //
    // this.modules = {};
    // this.classes = {};
    // this.monoPanes = ['project'];
    
    // this.settinger = new FG.Settinger();
    // this.registerModule(this.settinger);
    //
    //
    // this.projectCore = new FG.ProjectCore();
    this.dealer = new FG.Dealer();
    
    // this.projectPanel = new FG.ProjectPanel({target:'#project_panel'});
    // this.projectPanel.app = this;
    // this.projectPanel.initialize();
    //
    // this.plotter = new FG.Plotter();
    // this.plotter.app = this;
    //
    // // this.featureWidgetManager = new FG.FeatureWidgetManager();
    
    // this.mapPanel = new FG.MapPanel({target:'map_panel'});
    // this.userPanel = new FG.UserPanel();
    // // toolPanel should be inited after userPanel
    // this.toolPanel = new FG.ToolPanel();
    // this.searchBox = new DX.MapSearchBox({target: '#search', regionSearch: 'on'});
    //
    // // TODO: migrate all modules here
    // this.registerModule(this.plotter);
    // this.registerModule(this.projectCore);
    // this.registerModule(this.mapPanel);
    // this.registerModule(this.projectPanel);
    // this.registerModule(this.featureWidgetManager);
    // this._initPlotter();
    // this._initDBFeatureOptsParsers();
    // this._initFeatureModelParsers();
    // this._initFeatureWidgets();
    //
    // this.currentFocusPItem = undefined;

    // this.currentToolMode = 'project';
    // this.currentToolPane = 'project';
    
    // this.switchSnapshot = function(snapshot) {
    //
    // };
    
    // this.settinger.loadSysSetting();
    // this.settinger.loadUserSetting();
    // this.settinger.loadUserStatus();
    //
    // this.connectSignals();
    
    // DX.shout('app:loaded', this);
};

// FG.App.prototype.registerModule = function(mod) {
//     this.modules[mod.moduleInfo.name] = mod; 
//     if (!!mod.moduleInfo.exportList) {
//         _.each(mod.moduleInfo.exportList, function(name) {
//             FG[name] = _.bind(mod[name], mod);
//         })
//     }
//     if (mod.moduleInfo.paneMode === 'mono') {
//         this.monoPanes.push(mod.moduleInfo.name);
//     }
// };
//
// FG.App.prototype.hasModule = function(modName) {
//     return _.has(this.modules, modName);
// };
//
// FG.App.prototype.getModule = function(modName) {
//     return this.modules[modName];
// };
//
// FG.App.prototype.registerClass = function(c) {
//     this.classes[c.className] = c; 
// };
//
// FG.App.prototype.getClass = function(className) {
//     return this.classes[className];
// };

// FG.App.prototype._initPlotter = function() {
//     this.plotter.registerPlotDatatype({
//         timeseries: 'timeseries',
//         monthlystat: 'category',
//         diurnalstat: 'category',
//         monthlymean: 'category',
//         diurnalmean: 'category',
//         rose: 'rose',
//         wpdrose: 'rose',
//         winddist: 'dist',
//         summary: 'summary',
//         vertical_summary: 'vertical_summary'
//     });
//    
//     this.plotter.registerPlotFunc({
//         timeseries: FG.plotTimeseries,
//         category: FG.plotCategory,
//         rose: FG.plotRose,
//         dist: FG.plotDist,
//         summary: FG.plotSummary,
//         vertical_summary: _.partial(FG.plotSummary, _, _, {vertical: true})
//     });
// };
//
// FG.App.prototype._initDBFeatureOptsParsers = function() {
//     this.mapPanel.registerDBFeatureOptsParser(FG.defaultPItemDBFeatureOptsParser, 100);
// };
//
// FG.App.prototype._initFeatureModelParsers = function() {
//     this.mapPanel.registerFeatureModelParser(FG.pitemFeatureModelParser, 100);
//     this.mapPanel.registerFeatureModelParser(FG.geojsonFeatureModelParser, 200);
//     this.mapPanel.registerFeatureModelParser(FG.featureFeatureModelParser, 300);
//     this.mapPanel.registerFeatureModelParser(FG.objFeatureModelParser, 99999);
// };
//
// FG.App.prototype._initFeatureWidgets = function() {
//     var this_ = this;
//     _.each(
//         [FG.PointMarker, FG.RectFeature2, FG.MultiPolygonFeature, FG.MultiLineFeature],
//         function(fclass) {
//             this_.mapPanel.registerFeatureClass(fclass);
//         }
//     );
//    
//     _.each(
//         [FG.PointWidget, FG.RectWidget],
//         function(wclass) {
//             this_.mapPanel.registerWidgetClass(wclass);
//         }
//     )
// };
//
// FG.App.prototype.promptAddProject = function() {
//     if (this.currentToolMode !== 'project') {
//         return;
//     }
//     if (!DX.get('project:loaded', null)) {
//         alertify.alert('请先在左侧工程列表工具框中选择或创建一个工程, 再按提示添加所需的区域和坐标点.');
//     }
// };

FG.App.prototype.connectSignals = function() {
    var this_ = this,
        projectCore = this.getModule('projectCore'),
        projectPanel = this.getModule('projectPanel'),
        mapPanel = this.getModule('mapPanel');
    
    // DX.on('user_index_map:add!', function(m) {
    //     this_.searchBox.pushIndexEntry(m);
    // });


    
    // 购买相关
    DX.on('bought', function(uri) {
        var pack = projectCore.packManager.getPack(uri);
        if (!pack) {
            DX.error("Cannot find the pack!");
        } else {
            DX.warn(pack.uri);
            pack.reload({
                success: function() {
                    DX.shout('datapack:reloaded', uri)
                }
            });
        }
    });

    
    // DX.on('alert!', function(msg) {
    //     alertify.alert(msg);
    // });
    // //
    // DX.on('debug!', function(msg) {
    //     if (!!DX.get('debug')) {
    //         alertify.log(msg);
    //     }
    // });
    //
    // DX.on('sidebar:switched', function(paneName) {
    //     DX.shout('debug!', paneName);
    //     this_.currentToolPane = paneName;
    //     if (_.contains(this_.monoPanes, paneName)) {
    //         this_.currentToolMode = paneName;
    //         DX.shout('toolmode:switched', paneName);
    //         DX.shout('debug!', 'Tool Mode: ' + paneName);
    //     }
    // });
    // mapPanel.map.once('click dbclick', this.promptAddProject);
};